calcMI <- function(.tdm, .member, .vocab=NULL) {
    if (is.null(.vocab)) {
        .vocab <- colnames(.tdm)
    }
    ## 
    np <- sum(.member==1)
    ns <- sum(.member==0)
    ## 
    D = np + ns
    ## 
    m <- Matrix::t(.tdm)
    ## 
    nj <- Matrix::rowSums(m)
    nnotj <- rep(ncol(m), nrow(m)) - Matrix::rowSums(m)
    ## 
    njp <- Matrix::rowSums(m[,.member==1])
    njs <- Matrix::rowSums(m[,.member==0])
    ## 
    nnotjp <- rep(
        ncol(m[,.member==1]),
        nrow(m[,.member==1])
    ) - Matrix::rowSums(m[,.member==1])
    nnotjs <- rep(
        ncol(m[,.member==0]),
        nrow(m[,.member==0])
    ) - Matrix::rowSums(m[,.member==0])
    ## 
    mi <- njp/D*log((njp*D)/(np*nj),2) +
        njs/D*log((njs*D)/(nj*ns),2) +
        nnotjp/D*log((nnotjp*D)/(np*nnotj),2) +
        nnotjs/D*log((nnotjs*D)/(nnotj*ns),2)
    names(mi) <- .vocab
    ##
    return(list(
        neg=sort(mi[njp/np-njs/ns<0], decreasing=T)[1:15],
        pos=sort(mi[njp/np-njs/ns>0], decreasing=T)[1:15]
    ))
}
